home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcl / src-16f.lha / ldb / coreparse.c < prev    next >
C/C++ Source or Header  |  1991-11-06  |  4KB  |  144 lines

  1. /* $Header: coreparse.c,v 1.8 91/05/24 17:33:10 wlott Exp $ */
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/file.h>
  5.  
  6. #include "ldb.h"
  7. #include "os.h"
  8. #include "lisp.h"
  9. #include "globals.h"
  10. #include "core.h"
  11.  
  12. extern int version;
  13.  
  14. static void process_directory(fd, ptr, count)
  15. int fd, count;
  16. long *ptr;
  17. {
  18.     long id, offset, len;
  19.     lispobj *free_pointer;
  20.     os_vm_address_t addr;
  21.     struct ndir_entry *entry;
  22.  
  23.     entry = (struct ndir_entry *) ptr;
  24.  
  25.     while (count-- > 0) {
  26.         id = entry->identifier;
  27.         offset = CORE_PAGESIZE * (1 + entry->data_page);
  28.         addr = (os_vm_address_t) (CORE_PAGESIZE * entry->address);
  29.         free_pointer = (lispobj *) addr + entry->nwords;
  30.         len = CORE_PAGESIZE * entry->page_count;
  31.  
  32.         if (len != 0) {
  33.             os_vm_address_t real_addr;
  34. #ifdef PRINTNOISE
  35.             printf("Mapping %d bytes at 0x%x.\n", len, addr);
  36. #endif
  37.             real_addr=os_map(fd, offset, addr, len);
  38.             if(real_addr!=addr)
  39.             fprintf(stderr,
  40.           "process_directory: file mapped in wrong place! (0x%08x != 0x%08x)\n",
  41.                 real_addr,
  42.                 addr);
  43.         }
  44.  
  45. #if 0
  46.         printf("Space ID = %d, free pointer = 0x%08x.\n", id, free_pointer);
  47. #endif
  48.  
  49.         switch (id) {
  50.         case DYNAMIC_SPACE_ID:
  51.                     if (addr != (os_vm_address_t)dynamic_0_space && addr != (os_vm_address_t)dynamic_1_space)
  52.                         printf("Strange ... dynamic space lossage.\n");
  53.                     current_dynamic_space = (lispobj *)addr;
  54. #ifdef ibmrt
  55.             SetSymbolValue(ALLOCATION_POINTER, (lispobj)free_pointer);
  56. #else
  57.                     current_dynamic_space_free_pointer = free_pointer;
  58. #endif
  59.                     break;
  60.         case STATIC_SPACE_ID:
  61.             static_space = (lispobj *) addr;
  62.             break;
  63.         case READ_ONLY_SPACE_ID:
  64.             /* Don't care about read only space */
  65.             break;
  66.         default:
  67.             printf("Strange space ID: %d; ignored.\n", id);
  68.             break;
  69.         }
  70.         entry++;
  71.     }
  72. }
  73.  
  74. boolean load_core_file(file)
  75. char *file;
  76. {
  77.     int fd = open(file, O_RDONLY), count;
  78.     long header[CORE_PAGESIZE / sizeof(long)], val, len, *ptr;
  79.     boolean restore_state = FALSE;
  80.  
  81.     if (fd < 0) {
  82.         fprintf(stderr, "Could not open file \"%s\".\n", file);
  83.         perror("open");
  84.         exit(1);
  85.     }
  86.  
  87.     count = read(fd, header, CORE_PAGESIZE);
  88.     if (count < 0) {
  89.         perror("read");
  90.         exit(1);
  91.     }
  92.     if (count < CORE_PAGESIZE) {
  93.         fprintf(stderr, "Premature EOF.\n");
  94.         exit(1);
  95.     }   
  96.  
  97.     ptr = header;
  98.     val = *ptr++;
  99.  
  100.     if (val != CORE_MAGIC) {
  101.         fprintf(stderr, "Invalid magic number: 0x%x should have been 0x%x.\n",
  102.         val, CORE_MAGIC); 
  103.         exit(1);
  104.     }
  105.  
  106.     while (val != CORE_END) {
  107.         val = *ptr++;
  108.         len = *ptr++;
  109.  
  110.         switch (val) {
  111.             case CORE_END:
  112.                 break;
  113.  
  114.             case CORE_VERSION:
  115.                 if (*ptr != version) {
  116.                     fprintf(stderr, "WARNING: ldb version (%d) different from core version (%d).\nYou may lose big.\n", version, *ptr);
  117.                 }
  118.                 break;
  119.  
  120.             case CORE_VALIDATE:
  121.         fprintf(stderr, "Validation no longer supported; ignored.\n");
  122.                 break;
  123.  
  124.             case CORE_NDIRECTORY:
  125.                 process_directory(fd, ptr,
  126.                   (len-2) / (sizeof(struct ndir_entry) / sizeof(long)));
  127.                 break;
  128.  
  129.             case CORE_MACHINE_STATE:
  130.                 restore_state = TRUE;
  131.                 load(fd, (struct machine_state *)ptr);
  132.                 break;
  133.  
  134.             default:
  135.                 printf("Unknown core file entry: %d; skipping.\n", val);
  136.                 break;
  137.         }
  138.  
  139.         ptr += len - 2;
  140.     }
  141.  
  142.     return restore_state;
  143. }
  144.